/***********************************************
 **** 版权声明处 **
 ****  为了方便阅读和维护，请严格遵守相关代码规范，谢谢   ****
 *******************************************/
package bpm.graphic
{
	import avmplus.getQualifiedClassName;
	
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.utils.getDefinitionByName;
	
	import mx.core.ClassFactory;
	import mx.core.IDataRenderer;
	import mx.utils.ObjectUtil;
	import mx.utils.UIDUtil;
	
	import spark.components.supportClasses.SkinnableComponent;

	/*******************************************
	 **** huangjixin,2012-11-15,上午11:37:06 **
	 **** 请一句话表述该类主要作用  **
	 *******************************************/
	/**
	 * The Adorner subclass to be used when editing the Renderer.  
	 */
	[Style(name="adornerClass", inherit="yes", type="Class")]
	
	[SkinState("normal")]
	
	[SkinState("selected")]
	public class Renderer extends SkinnableComponent implements IDataRenderer
	{
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// private 类私有静态变量和静态常量声明处。（全部大写，使用下划线进行分割）
		// 例如：private static const EXAMPLE:String = "example";
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// public 类公有静态变量和静态常量声明处。（全部大写，使用下划线进行分割）
		// 例如：public static const EXAMPLE:String = "example";
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// private 私有变量声明处，请以“_”开头定义变量
		// 例如：private var _example:String;
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		//-------------------
		// 	label私有变量
		//-------------------
		
		private var _data:Object;
		//-------------------
		// 	isSelected私有变量，默认为false。
		//-------------------
		private var _isSelected:Boolean = false;
		
		private var _selectable : Boolean = true;
		
		private var _resizable : Boolean = true;
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// public 公有变量声明处
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// 构造函数，初始化相关工作可以放在里面
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		public function Renderer()
		{
			//TODO: implement function
			super();
		}//构造函数结束
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// getter和setter函数
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		[Bindable(event="isSelectedChange")]
		/**
		 * Node对象有两种状态，选中与非选中。
		 * @return 
		 * 
		 */
		public function get isSelected():Boolean
		{
			return _isSelected;
		}
		
		public function set isSelected(value:Boolean):void
		{
			if(!selectable){
				return;
			}
			if( _isSelected !== value)
			{
				_isSelected = value;
				dispatchEvent(new Event("isSelectedChange"));
				invalidateSkinState();
			}
		}
		
		
		[Bindable(event="selectableChange")]
		public function get selectable():Boolean
		{
			return _selectable;
		}
		
		public function set selectable(value:Boolean):void
		{
			if( _selectable !== value)
			{
				_selectable = value;
				dispatchEvent(new Event("selectableChange"));
			}
		}
		
		
		[Bindable(event="resizableChange")]
		public function get resizable():Boolean
		{
			return _resizable;
		}
		
		public function set resizable(value:Boolean):void
		{
			if( _resizable !== value)
			{
				_resizable = value;
				dispatchEvent(new Event("resizableChange"));
			}
		}
		
		public function get data():Object
		{
			return _data;
		}
		
		public function set data(value:Object):void
		{
			_data = value;
		}
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// 相关事件响应函数和逻辑函数存放处
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		/**
		 * 该函数是Node类的克隆函数，它将克隆皮肤，label属性，长宽度，纵横坐标，并且产生一个随机Id。 
		 * @return 
		 * 
		 */
		public function clone():Renderer{
			/*var cloneObject:Object = ObjectUtil.getClassInfo(this);
			var properties:Array = cloneObject['properties'];*/
			/*for each (var qName:QName in properties) 
			{
			var localName:Object = qName.localName;
			if(this.hasOwnProperty(localName)){
			
			if (qName.uri == ""){
			renderer[localName] = null;					
			}else{
			renderer[localName] = qName.uri;
			}
			}
			}*/
			
			//-------------------
			// 	通过工厂模式创建类对象，并且设置类的皮肤
			//-------------------
			var className:String=getQualifiedClassName(this);
			var ClassName:Class=getDefinitionByName(className) as Class;
			var classFactory:ClassFactory = new ClassFactory(ClassName);
			var renderer:Renderer = classFactory.newInstance();
			var skinClass:* = this.getStyle("skinClass");
			
			//-------------------
			// 	为克隆节点设置皮肤，长宽度，纵横坐标，id。
			//-------------------
			renderer.setStyle("skinClass",this.getStyle("skinClass"));
//			renderer.label = this.label;
			renderer.width = this.width;
			renderer.height = this.height;
			renderer.x = this.x;
			renderer.y = this.y;
			renderer.name = this.name;
			renderer.selectable = this.selectable;
			renderer.resizable = this.resizable;
			
			var dotIndex:int = className.lastIndexOf("::");
			if(dotIndex > 0){
				var name:String = className.substring(dotIndex+2, className.length);
				name = name.toLowerCase();
			}
			renderer.id = name+UIDUtil.createUID();
			return renderer;
		}
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// override 覆盖函数
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		override protected function getCurrentSkinState():String
		{
			if (isSelected){
				return "selected";
			}else{
				return "normal";
			}
			return super.getCurrentSkinState();
		}
		
		/**
		 * 默认每个节点的宽度为100，高度为50. 
		 * 
		 */
		override protected function measure():void{
			this.measuredWidth = 100;
			this.measuredHeight = 50;
		}

	}//类结束
}//包结束